package br.com.playonline.bussines;

import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import br.com.playonline.domain.Bolao;
import br.com.playonline.domain.Jogo;
import br.com.playonline.domain.TipoDeJogo;
import br.com.playonline.dto.BolaoDTO;
import br.com.playonline.dto.JogoDTO;
import br.com.playonline.persistencia.BolaoHibernateDAO;
import br.com.playonline.persistencia.JogoDAO;
import br.com.playonline.util.bolao.GeradorDeJogos;

@Component
public class BolaoBU {

	@Autowired
	BolaoHibernateDAO bolaoDAO;
	
	@Autowired
	JogoDAO jogoDAO;
	
	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
	public String inserirBolao(BolaoDTO bolaoDTO){
		List<Integer> sequenciaObrigatoria = stringToList(bolaoDTO.getSeqObrigatoria());
		List<Integer> sequenciaIgnorada = stringToList(bolaoDTO.getSeqIgnorada());

		List<Jogo> jogos = new ArrayList<Jogo>();
		TipoDeJogo tipoDeJogo = getTipoDeJogo(bolaoDTO.getTipoDeJogo());
		if(tipoDeJogo == null){
			return "false";
		}
		Bolao bolao = new Bolao();
		bolao.setDtSorteio(getDate(bolaoDTO.getDtSorteio()));
		bolao.setIdentificadorGrupo(bolaoDTO.getIdentificadorGrupo());
		bolao.setJogos(jogos);
		bolao.setQtdCotas(new Integer(bolaoDTO.getQtdCotas()));
		bolao.setQtdJogos(new Integer(bolaoDTO.getQtdJogos()));
		bolao.setQtdNumerosMarcado(new Integer(bolaoDTO.getQtdNumerosMarcado()));
		bolao.setSeqIgnorada(bolaoDTO.getSeqIgnorada());
		bolao.setSeqObrigatoria(bolaoDTO.getSeqObrigatoria());
		bolao.setValorCota(new Double(bolaoDTO.getValorCota()));
		bolao.setTipoDeJogo(tipoDeJogo);
		
		GeradorDeJogos geradorDeJogos = new GeradorDeJogos();
		List<String> jogosGerado = geradorDeJogos.gerarJogos(new Integer(bolaoDTO.getQtdJogos()), sequenciaIgnorada, new Integer(bolaoDTO.getQtdNumerosMarcado()), 60, sequenciaObrigatoria);
		for(String j : jogosGerado){
			Jogo jogo = new Jogo();
			jogo.setSequencia(j);
			jogo.setBolao(bolao);
			jogos.add(jogo);
		}

		bolaoDAO.save(bolao);

		for(Jogo jogo : jogos){
			jogoDAO.save(jogo);
		}
		
		if(bolao.getId() > 0)
			return "success";
		
		return "false";
	}
	
	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
	public List<BolaoDTO> findByTipoDeJogo(Integer tipoDeJogoInt){
		TipoDeJogo tipoDeJogo = getTipoDeJogo(tipoDeJogoInt);
		List<Bolao> bolaos = this.bolaoDAO.findByTipoDeJogo(tipoDeJogo);
		List<BolaoDTO> bolaoDTOs = new ArrayList<BolaoDTO>();
		for(Bolao bolao : bolaos){
			BolaoDTO bolaoDTO = new BolaoDTO();
			bolaoDTO.setId(bolao.getId());
			bolaoDTO.setIdentificadorGrupo(bolao.getIdentificadorGrupo());
			bolaoDTO.setQtdCotas(bolao.getQtdCotas());
			bolaoDTO.setValorCota(formatDoubleToString(bolao.getValorCota()));
			bolaoDTO.setTipoDeJogo(bolao.getTipoDeJogo().getValor());
			bolaoDTOs.add(bolaoDTO);
		}
		return bolaoDTOs;
	}
	
	public List<BolaoDTO> findAll(){
		List<Bolao> bolaos = this.bolaoDAO.findAll();
		List<BolaoDTO> bolaoDTOs = new ArrayList<BolaoDTO>();
		for(Bolao bolao : bolaos){
			BolaoDTO bolaoDTO = new BolaoDTO();
			bolaoDTO.setId(bolao.getId());
			bolaoDTO.setIdentificadorGrupo(bolao.getIdentificadorGrupo());
			bolaoDTO.setQtdCotas(bolao.getQtdCotas());
			bolaoDTO.setValorCota(formatDoubleToString(bolao.getValorCota()));
			bolaoDTO.setTipoDeJogo(bolao.getTipoDeJogo().getValor());
			bolaoDTOs.add(bolaoDTO);
		}
		return bolaoDTOs;
	}

	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
	public List<JogoDTO> findJogoByBolao(Long idBolao){
		Bolao bolao = this.bolaoDAO.findById(idBolao);
		List<JogoDTO> jogoDTOs = new ArrayList<JogoDTO>();
		if(bolao != null){
			List<Jogo> jogos = bolao.getJogos();
			if(jogos != null && jogos.size() > 0){
				for(Jogo jogo : jogos){
					JogoDTO jogoDTO = new JogoDTO();
					jogoDTO.setId(jogo.getId());
					jogoDTO.setSequencia(jogo.getSequencia());
					jogoDTOs.add(jogoDTO);
				}
			}
		}
		return jogoDTOs;
	}
	
	private Date getDate(String data){
		DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		Date date = null;
		try {
			if(data != null && data.length() >= 8){
				String dia = data.substring(0, 2);
				String mes = data.substring(2, 4);
				String ano = data.substring(4, 8);
				date = dateFormat.parse(dia +"/"+ mes +"/"+ ano);
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return date;
	}
	
	private List<Integer> stringToList(String valor){
		List<Integer> sequencia = new ArrayList<Integer>();
		if(valor != null && valor.length() > 0){
			String[] valores = valor.split(" ");
			for(String val : valores){
				sequencia.add(new Integer(val));
			}
		}
		return sequencia;
	}
	
	private TipoDeJogo getTipoDeJogo(Integer tipo){
		TipoDeJogo tipoDeJogo = null;
		if(tipo == 1){
			tipoDeJogo = TipoDeJogo.MEGA_SENA;
		}else if(tipo == 2){
			tipoDeJogo = TipoDeJogo.QUINA;
		}else if(tipo == 3){
			tipoDeJogo = TipoDeJogo.LOTO_MANIA;
		}else if(tipo == 4){
			tipoDeJogo = TipoDeJogo.DUPLA_SENA;
		}else if(tipo == 4){
			tipoDeJogo = TipoDeJogo.LOTO_FACIL;
		}
		return tipoDeJogo;
	}
	
	private String formatDoubleToString(Double valor){
		String valorFormatado = "";
		if(valor != null)
			valorFormatado = NumberFormat.getCurrencyInstance().format(valor);
		return valorFormatado;
	}
	
	public static void main(String[] args) {
		Double d = 123.3;
		System.out.println(new Double("223.232,22"));
	}
	
	
}
